/*
 * @Author: your name
 * @Date: 2021-12-27 13:25:29
 * @LastEditTime: 2021-12-27 14:08:29
 * @LastEditors: Please set LastEditors
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: /flutter-learning/Dart_Basic_Grammer/abstract_class.dart
 */

/**
 * Dart中抽象类：Dart 抽象类主要用于定义标准，子类可以继承抽象类，也可以实现抽象类接口
 * 
 *    1. 抽象类通过 abstract 关键字来定义
 *    2. Dart 中的抽象方法不能用 abstract 声明，Dart 中没有方法体的方法我们称为抽象方法
 *    3. 如果子类继承抽象类必须得实现里边的抽象方法
 *    4. 如果把抽象类当做接口实现的话，必须得实现抽象类里边定义的所有属性和方法
 *    5. 抽象类不能被实例化，只有继承它的子类可以
 * 
 * extends 抽象类和 implements 的区别
 *    1. 如果要复用抽象类里边的方法，并且要用抽象方法约束自类的话，就用 extends 来继承抽象类
 *    2. 如果只是把抽象类当作标准的话就用 implements 实现抽象类接口
 */

// 定义一个 Animal 类，子类里边必须包含 eat 方法
abstract class Animal {
  // 抽象方法
  eat();
  void printInfo() {
    print("In abstracct class Animal");
  }
}

// 子类
class Dog extends Animal {
  @override
  eat() {
    // TODO: implement eat
    // throw UnimplementedError();
    print('little dog');
  }
  
}

class Cat extends Animal {
  @override
  eat() {
    // TODO: implement eat
    // throw UnimplementedError();
    print('Cat eat');
  }
  
}

void main(List<String> args) {
  Dog d = new Dog();
  d.eat();
  d.printInfo();
  Cat c = new Cat();
  d.printInfo();
  c.eat();

  // 抽象类没办法被实例化
  // Animal a = Animal();
}